package com.ego.e

/**
 * Created by lxy on 2017/5/21.
 */
class EKotlin {

    fun kotlin(): String {
        return "Hello Kotlin"
    }

    fun sum(a: Int, b: Int): Int {
        return a + b
    }

    fun format(value: String) {
        println("value = $value")
    }

    fun isEmpty(str: String?): Boolean {
        return str == null || str.isEmpty()
    }

    fun inRange(value: Int) {
        if (value in 1..10) {
            println("Yes")
        } else {
            println("No")
        }
    }

    /**Kotlin中并没有三元运算符，使用if else替换，如下*/
    fun append(list: List<String>) {
        var sb = StringBuilder()
        for (str in list) {
            var index = list.indexOf(str)
            sb.append(if (index > 0) "," else "")
            sb.append(str)
        }
        println(sb.toString())
    }

    fun switch(value: Int){
        when(value){
            in 1..10 -> {
                println("in range 1~10")
                println("我终于知道在when中写多行代码了")
            }
            11 -> println("Hello 11")
            else -> println("no in range")
        }
    }

    fun label(){
        var value = 2
        foo@ for (va in 0..10){
            if (va == value){
                break@foo
            }else{
                println(va)
            }
        }
    }

    /**Joshua Bloch 将那些只能 读取 的对象称为 生产者(Producer), 将那些只能 写入 的对象称为 消费者(Consumer).
     * 他建议: “为尽量保证灵活性, 应该对代表生产者和消费者的输入参数使用通配符类型”,
     * 他还提出了下面的记忆口诀:PECS: 生产者(Producer)对应 Extends, 消费者(Consumer) 对应 Super.*/

    /**in表示消费者，in类似java的Array<? super Son>,表示可以安全的写入*/
    fun consumer(consumer:Array<in Son>){
    }

    /**out表示生产者，out类似java的Array<? extend Son>,表示可以安全的读取*/
    fun producer(producer:Array<out Son>){
    }

    /**泛型约束*/
    fun <T:Father>producer2(producer:Array<T>){
    }

    /**总结：in是安全的写入，out是安全的读取*/

    open class Father
    open class Son:Father()
    class Grandson:Son()

    fun test(){

        var grandsons = arrayOf<Grandson>()
        producer(grandsons)//ok

        var fathers = arrayOf<Father>()
        consumer(fathers)//ok

        //producer(fathers)//不允许

        //consumer(grandsons)//不允许
    }

}